﻿Imports Lourdes.BackEnd.BC
Imports Lourdes.BackEnd.Interfaces
Imports Lourdes.BackEnd.View
Imports Lourdes.BackEnd.Modelo
Imports Lourdes.BackEnd
Imports Infragistics.Win
Imports Infragistics.Win.UltraWinGrid
Public Class frmLogisticaManager

  'Si se modifica el valor del control, se pone en verdadero el valor de esta bandera 
  'para detectar si en el ExitEdit tengo que recargar la grilla.
  Dim editoresValueChange As Boolean = False

  Private Sub frmLogisticaManager_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    ConfigurarControles()
  End Sub

  Private Sub ConfigurarControles()
    editoresValueChange = False 'inicializo, valuechanged se ejecuta solo al principio.
    CargarFiltroEstados()
    CargarGrid()
  End Sub
  Private Sub CargarFiltroEstados()
    With chkCmbEstados
      .DataSource = [Enum].GetValues(GetType(Enums.EntregaEstados))
      Dim i As Integer = 0
      For i = 0 To .Items.Count - 1
        .SetItemChecked(i, True)
      Next
    End With
  End Sub
  Private Function EstadosSeleccionados() As List(Of Integer)
    Dim resu As New List(Of Integer)
    For Each item In chkCmbEstados.CheckedItems
      resu.Add(CInt(item))
    Next
    Return resu
  End Function
  Private Sub CargarGrid()
    editoresValueChange = False
    With grdEntregas
      .DataSource = New List(Of Entrega) 'Para limpiar la grilla entre filtrados, sino genera problemas con datos anteriores.
      .DataBind()
      .DataSource = getData()
      .DataBind()
    End With
  End Sub

  Private Function getData() As List(Of Entrega)
    Dim lstEstados As List(Of Integer) = EstadosSeleccionados()
    Return (New BC_Entrega).getByFilters(lstEstados, Utils.getIntFromEditor(txtEntregaId), Utils.getIntFromEditor(txtFacturaId))
  End Function

  Private Sub grdEntregas_AfterCellUpdate(sender As Object, e As Infragistics.Win.UltraWinGrid.CellEventArgs) Handles grdEntregas.AfterCellUpdate
    If e.Cell.Column.Key = "CadetePerId" Then
      If IsNumeric(e.Cell.Row.Cells("CadetePerId").Value) Then
        BC_Entrega.UpdateCadete(e.Cell.Row.Cells("EntregaId").Value, e.Cell.Row.Cells("CadetePerId").Value)
      End If
    ElseIf e.Cell.Column.Key = "FechaHoraEntregaPactada" Then
      Dim objEntrega As Entrega = e.Cell.Row.ListObject
      BC_Entrega.UpdateFechaEntrega(objEntrega.EntregaId, objEntrega.FechaHoraEntregaPactada)
    End If
  End Sub

  Private Sub grdEntregas_ClickCellButton(sender As Object, e As Infragistics.Win.UltraWinGrid.CellEventArgs) Handles grdEntregas.ClickCellButton
    Dim key As String = e.Cell.Column.Key
    If key = "EstadoPendiente" Or key = "EstadoEnviado" Or key = "EstadoEntregado" Or key = "EstadoCancelado" Then
      ClickEnBotonEstado(e.Cell)
    End If
    If key = "mapa" Then
      MostrarMapa(e.Cell)
    End If
  End Sub
  Private Sub MostrarMapa(pCelda As UltraGridCell)
    Dim intEntregaId As Integer = CInt(pCelda.Row.Cells("EntregaId").Value)
    Dim frmLog As New frmLogistica(intEntregaId, True)
    'frmLog.LoadLogisticaFromFactura(intEntregaId)
    frmLog.ShowDialog(Me)
  End Sub
  Private Sub ClickEnBotonEstado(pCelda As UltraGridCell)
    Dim estadoSel As Enums.EntregaEstados = getEstadoEntregaFromButton(pCelda)
    Select Case estadoSel
      Case Enums.EntregaEstados.Enviado
        EstadoPasarEnviado(pCelda)
      Case Enums.EntregaEstados.Entregado
        EstadoPasarEntregado(pCelda)
      Case Enums.EntregaEstados.Cancelado
        EstadoPasarCancelado(pCelda)
      Case Enums.EntregaEstados.Pendiente
        EstadoPasarPendiente(pCelda)
    End Select
  End Sub
  Private Sub EstadoPasarEnviado(pCelda As UltraGridCell)
    If Not IsNumeric(pCelda.Row.Cells("CadetePerId").Value) Then
      MsgBox("Debe asignar un cadete a la entrega para poderla enviar.", MsgBoxStyle.Critical)
    Else
      Dim entEntrega As Entrega = pCelda.Row.ListObject
      entEntrega.Estado = CInt(Enums.EntregaEstados.Enviado)
      BC_Entrega.UpdateEstado(entEntrega.EntregaId, entEntrega.Estado, "")
      grdConfEstados(pCelda.Row, entEntrega)
    End If
  End Sub
  Private Sub EstadoPasarEntregado(pCelda As UltraGridCell)
    Dim entEntrega As Entrega = pCelda.Row.ListObject
    entEntrega.Estado = CInt(Enums.EntregaEstados.Entregado)
    BC_Entrega.UpdateEstado(entEntrega.EntregaId, entEntrega.Estado, "")
    grdConfEstados(pCelda.Row, entEntrega)
  End Sub
  Private Sub EstadoPasarCancelado(pCelda As UltraGridCell)
    If MsgBox("¿Está seguro que desea cancelar la entrega?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
      Dim entEntrega As Entrega = pCelda.Row.ListObject
      entEntrega.Estado = CInt(Enums.EntregaEstados.Cancelado)
      BC_Entrega.UpdateEstado(entEntrega.EntregaId, entEntrega.Estado, "")
      grdConfEstados(pCelda.Row, entEntrega)
    End If
  End Sub
  Private Sub EstadoPasarPendiente(pCelda As UltraGridCell)
    Dim entEntrega As Entrega = pCelda.Row.ListObject
    entEntrega.Estado = CInt(Enums.EntregaEstados.Pendiente)
    BC_Entrega.UpdateEstado(entEntrega.EntregaId, entEntrega.Estado, "")
    grdConfEstados(pCelda.Row, entEntrega)
  End Sub
  Private Function getEstadoEntregaFromButton(pCelda As UltraGridCell) As Enums.EntregaEstados
    Select Case pCelda.Column.Key
      Case "EstadoPendiente"
        Return Enums.EntregaEstados.Pendiente
      Case "EstadoEnviado"
        Return Enums.EntregaEstados.Enviado
      Case "EstadoEntregado"
        Return Enums.EntregaEstados.Entregado
      Case "EstadoCancelado"
        Return Enums.EntregaEstados.Cancelado
    End Select
  End Function

  Private Sub grdEntregas_InitializeLayout(sender As Object, e As Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs) Handles grdEntregas.InitializeLayout
    Dim lstPer As List(Of Persona)
    Dim bcPer As New BC_Persona
    Dim vl As ValueList
    If (Not e.Layout.ValueLists.Exists("MyValueList")) Then
      vl = e.Layout.ValueLists.Add("MyValueList")
      lstPer = bcPer.GetByPersonaTipo(Enums.PersonaTipo.Cadete)
      For Each unaPer In lstPer
        vl.ValueListItems.Add(unaPer.PersonaId, unaPer.Nombre & " " & unaPer.Apellido)
      Next
    End If
    With e.Layout.Bands(0).Columns("CadetePerId")
      .ValueList = e.Layout.ValueLists("MyValueList")
      .Style = UltraWinGrid.ColumnStyle.DropDownList
    End With
  End Sub

  Private Sub grdEntregas_InitializeRow(sender As Object, e As Infragistics.Win.UltraWinGrid.InitializeRowEventArgs) Handles grdEntregas.InitializeRow
    With e.Row
      .Cells("EntregaPersona").Value = .Cells("DestApellido").Value & ", " & .Cells("DestNombre").Value
      .Cells("EntregaTelefonos").Value = grdImprimirTelefonos(.Cells("DestTelefono").Value, .Cells("DestTelefonoCel").Value)
      .Cells("EntregaDireccion").Value = grdImprimirDire(.ListObject)
      grdConfEstados(e.Row, .ListObject)
      .Cells("mapa").Value = "..."
    End With
  End Sub

  Private Function grdImprimirTelefonos(pTel As String, pTelCel As String) As String
    Dim strTel As String = ""
    Dim strCel As String = ""
    Dim strSeparador As String = ""

    If String.IsNullOrEmpty(pTel) Then
      strTel = ""
    Else
      strTel = "" & pTel
    End If

    If String.IsNullOrEmpty(pTelCel) Then
      strCel = ""
    Else
      strCel = "" & pTelCel
    End If

    If Not String.IsNullOrEmpty(strTel) And Not String.IsNullOrEmpty(strCel) Then
      strSeparador = " - "
    End If

    Return strTel & strSeparador & strCel

  End Function

  Private Function grdImprimirDire(pEntrega As Entrega) As String
    Dim dire As String = ""
    With pEntrega
      dire &= pEntrega.DestCalle
      dire &= " " & pEntrega.DestNumero
      dire &= " - Bº " & pEntrega.DestBarrio
      dire &= " - " & pEntrega.DestCiudad
    End With
    Return dire
  End Function

  Private Sub grdConfEstados(pRow As UltraWinGrid.UltraGridRow, pEntrega As Entrega)
    Dim celPen As UltraGridCell = pRow.Cells("EstadoPendiente")
    Dim celEnv As UltraGridCell = pRow.Cells("EstadoEnviado")
    Dim celEnt As UltraGridCell = pRow.Cells("EstadoEntregado")
    Dim celCan As UltraGridCell = pRow.Cells("EstadoCancelado")

    If pEntrega.Estado = Enums.EntregaEstados.Pendiente Then
      grdBotonAzul(celPen)
      grdBotonVerde(celEnv)
      grdBotonRojo(celEnt)
      grdBotonVerde(celCan)
    ElseIf pEntrega.Estado = Enums.EntregaEstados.Enviado Then
      grdBotonVerde(celPen)
      grdBotonAzul(celEnv)
      grdBotonVerde(celEnt)
      grdBotonVerde(celCan)
    ElseIf pEntrega.Estado = Enums.EntregaEstados.Entregado Then
      grdBotonRojo(celPen)
      grdBotonRojo(celEnv)
      grdBotonAzul(celEnt)
      grdBotonRojo(celCan)
    ElseIf pEntrega.Estado = Enums.EntregaEstados.Cancelado Then
      grdBotonRojo(celPen)
      grdBotonRojo(celEnv)
      grdBotonRojo(celEnt)
      grdBotonAzul(celCan)
    End If
  End Sub

  Private Sub grdBotonRojo(pCelda As UltraGridCell)
    With pCelda
      .Activation = Activation.Disabled
      .ButtonAppearance.BackColor = Color.Red
    End With
  End Sub

  Private Sub grdBotonVerde(pCelda As UltraGridCell)
    With pCelda
      .Activation = Activation.AllowEdit
      .ButtonAppearance.BackColor = Color.Green
    End With
  End Sub

  Private Sub grdBotonAzul(pCelda As UltraGridCell)
    With pCelda
      .Activation = Activation.Disabled
      .ButtonAppearance.BackColor = Color.Blue
    End With
  End Sub

  Private Sub chkCmbEstados_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles chkCmbEstados.SelectedIndexChanged
    CargarGrid()
  End Sub

  Private Sub btnCancelar_Click(sender As System.Object, e As System.EventArgs) Handles btnCancelar.Click
    Me.Dispose()
    Me.Close()
  End Sub

  Private Sub txtFacturaId_AfterExitEditMode(sender As Object, e As System.EventArgs) Handles txtFacturaId.AfterExitEditMode
    If editoresValueChange Then CargarGrid()
  End Sub

  Private Sub txtEntregaId_AfterExitEditMode(sender As Object, e As System.EventArgs) Handles txtEntregaId.AfterExitEditMode
    If editoresValueChange Then CargarGrid()
  End Sub

  Private Sub txtFacturaId_ValueChanged(sender As Object, e As System.EventArgs) Handles txtFacturaId.ValueChanged
    editoresValueChange = True
  End Sub

  Private Sub txtEntregaId_ValueChanged(sender As Object, e As System.EventArgs) Handles txtEntregaId.ValueChanged
    editoresValueChange = True
  End Sub
End Class